#pragma once

#include <QString>
#include <optional>
#include "../nlohmann/json.hpp"

using json = nlohmann::json;

class User {
public:
    std::optional<int> userId;
    std::optional<std::string> username;
    std::optional<std::string> password;
    std::optional<std::string> email;
    std::optional<std::string> phone;
    std::optional<std::string> role;
    std::optional<std::string> createdAt;
    std::optional<std::string> updatedAt;

    json toJson() const {
        json j;
        j["userId"] = userId.has_value() ? json(*userId) : json(nullptr);
        j["username"] = username.has_value() ? json(*username) : json(nullptr);
        j["password"] = password.has_value() ? json(*password) : json(nullptr);
        j["email"] = email.has_value() ? json(*email) : json(nullptr);
        j["phone"] = phone.has_value() ? json(*phone) : json(nullptr);
        j["role"] = role.has_value() ? json(*role) : json(nullptr);
        j["createdAt"] = createdAt.has_value() ? json(*createdAt) : json(nullptr);
        j["updatedAt"] = updatedAt.has_value() ? json(*updatedAt) : json(nullptr);
        return j;
    }

    static User fromJson(const json &j) {
        User u;
        if (j.contains("userId") && !j["userId"].is_null()) u.userId = j["userId"].get<int>();
        if (j.contains("username") && !j["username"].is_null()) u.username = j["username"].get<std::string>();
        if (j.contains("password") && !j["password"].is_null()) u.password = j["password"].get<std::string>();
        if (j.contains("email") && !j["email"].is_null()) u.email = j["email"].get<std::string>();
        if (j.contains("phone") && !j["phone"].is_null()) u.phone = j["phone"].get<std::string>();
        if (j.contains("role") && !j["role"].is_null()) u.role = j["role"].get<std::string>();
        if (j.contains("createdAt") && !j["createdAt"].is_null()) u.createdAt = j["createdAt"].get<std::string>();
        if (j.contains("updatedAt") && !j["updatedAt"].is_null()) u.updatedAt = j["updatedAt"].get<std::string>();
        return u;
    }
};

